package com.quik.backend.mapper;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;

import com.quik.util.CommonUtils;

/**
 * 
 * 功能说明： 数据库访问层DAO基类、
 * 
 * @author Jenny Liu
 * 
 */
@SuppressWarnings("rawtypes")
public class BaseDao<T> {

	@Autowired
	private SqlSessionTemplate sessionTemplate;

	@SuppressWarnings("unused")
	private Class entityClass;

	// 反射方式获取子类DAO对应的泛型实体类
	public BaseDao() {
		Type genType = getClass().getGenericSuperclass();
		Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
		entityClass = (Class) params[0];
	}

	/**
	 * 根据ID获取对象
	 * 
	 * @param id
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public T get(String sql, Serializable id) {
		return (T) sessionTemplate.selectOne(sql, id);
	}

	/**
	 * 根据用户查询返回单一对象
	 * 
	 * @param sql
	 * @param obj
	 * @return
	 */
	public Object get(String sql, Object obj) {
		return sessionTemplate.selectOne(sql, obj);
	}

	/**
	 * 加载所有对象
	 * 
	 * @param sql
	 * @return
	 */
	public List loadAll(String sql) {
		return (List) sessionTemplate.selectList(sql);
	}

	/**
	 * 根据条件加载对象列表
	 * 
	 * @param sql
	 * @param params
	 * @return
	 */
	public List load(String sql, Object params) {
		return (List) sessionTemplate.selectList(sql, params);
	}

	/**
	 * 新增对象
	 * 
	 * @param sql
	 * @param params
	 */
	public void add(String sql, Object params) {
		sessionTemplate.insert(sql, params);
	}

	/**
	 * 新增对象
	 * 
	 * @param sql
	 * @param params
	 */
	public void add(String sql) {
		sessionTemplate.insert(sql);
	}

	/**
	 * 根据条件修改对象
	 * 
	 * @param sql
	 * @param params
	 */
	public void update(String sql, Object params) {
		sessionTemplate.update(sql, params);
	}

	/**
	 * 修改对象
	 * 
	 * @param sql
	 */
	public void update(String sql) {
		sessionTemplate.update(sql);
	}

	/**
	 * 删除对象
	 * 
	 * @param sql
	 */
	public void del(String sql) {
		sessionTemplate.delete(sql);
	}

	/**
	 * 根据条件删除对象
	 * 
	 * @param sql
	 */
	public void del(String sql, Object params) {
		sessionTemplate.delete(sql, params);
	}

	public void updateByFull(Object pojo) {
		String sql = "update" + pojo.getClass().getSimpleName() + "ByFull";
		this.update(sql, pojo);
	}

	public void insert(Object pojo) {
		String sql = "insert" + pojo.getClass().getSimpleName();
		this.update(sql, pojo);
	}

	public Object queryById(Class clazz, Integer id) {
		return this.queryById(clazz.getSimpleName(), id);
	}

	private Object queryById(String pojoName, Integer id) {
		String sql = "query" + pojoName + "ById";
		return this.get(sql, id);
	}

	private List queryByMap(String pojoName, Map<String, Object> params) {
		String sql = "query" + pojoName + "ByMap";
		if(params==null) params = new HashMap<String,Object>();
		return this.load(sql, params);
	}

	public List queryByMap(Class clazz, Map<String, Object> params) {
		return this.queryByMap(clazz.getSimpleName(), params);
	}

	private List queryByProp(String pojoName, String name, Object value) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put(name, value);
		String sql = "query" + pojoName + "ByMap";
		return this.load(sql, params);
	}

	public List queryByProp(Class clazz, String name, Object value) {
		return this.queryByProp(clazz.getSimpleName(), name, value);
	}

	@SuppressWarnings("unchecked")
	public Object queryOneByProp(Class clazz, String name, Object value) {
		return CommonUtils.queryOne(this.queryByProp(clazz.getSimpleName(),
				name, value));
	}

	@SuppressWarnings("unchecked")
	public Object queryOneByMap(Class clazz, Map<String, Object> params) {
		return CommonUtils.queryOne(this.queryByMap(clazz.getSimpleName(),
				params));
	}

}